package com.carbon.assets.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.carbon.assets.entity.CarbonAssets;
import com.carbon.assets.mapper.CarbonAssetsMapper;
import com.carbon.assets.param.CarbonAssetsQueryParam;
import com.carbon.assets.service.CarbonAssetsService;
import com.carbon.assets.vo.CarbonAssetsQueryVo;
import com.carbon.common.api.Paging;
import com.carbon.common.exception.CommonBizException;
import com.carbon.common.service.BaseServiceImpl;
import com.carbon.domain.system.api.SystemServiceApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;



@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
// 碳中和资产服务实现类
public class CarbonAssetsServiceImpl extends BaseServiceImpl<CarbonAssetsMapper, CarbonAssets> implements CarbonAssetsService {

    // 注入碳中和资产Mapper
    @Resource
    private CarbonAssetsMapper carbonAssetsMapper;
    // 注入碳区块链消息生产者
    @Autowired
    private CarbonBlockChainMsgProduce carbonBlockChainMsgProduce;
    // 注入系统服务API
    @Autowired
    private SystemServiceApi systemServiceApi;

    /**
     * 根据ID获取碳中和资产信息
     * @param id 资产ID
     * @return 碳中和资产查询对象
     */
    @Override
    public CarbonAssetsQueryVo getCarbonAssetsById(Long id) {
        // 创建查询参数
        CarbonAssetsQueryParam queryParam = new CarbonAssetsQueryParam();
        queryParam.setId(id);
        // 调用分页查询方法，获取分页结果
        List<CarbonAssetsQueryVo> records = getCarbonAssetsPageList(queryParam).getRecords();
        // 返回第一个记录
        return CollUtil.getFirst(records);
    }

    /**
     * 分页获取碳中和资产列表
     * @param param 查询参数
     * @return 分页结果
     */
    @Override
    public Paging<CarbonAssetsQueryVo> getCarbonAssetsPageList(CarbonAssetsQueryParam param) {
        // 获取分页对象
        Page<?> page = getPage(param);
        // 添加排序规则，按更新时间降序
        page.addOrder(OrderItem.desc("ca.updated_time"));
        // 执行查询并返回分页数据
        IPage<CarbonAssetsQueryVo> iPage = carbonAssetsMapper.getCarbonAssetsPageList(page,param);
        // 将查询结果转换为业务层分页对象
        return new Paging<>(iPage);
    }

    /**
     * 新增碳中和资产
     * @param carbonAssets 碳中和资产对象
     */
    @Override
    public void addCarbonAssets(CarbonAssets carbonAssets) {
        // 设置接收者ID为当前租户ID
        carbonAssets.setReceivingId(getCurrentTenantId());
        // 设置发布者ID为当前租户ID
        carbonAssets.setPublishId(getCurrentTenantId());
        // 保存资产信息
        save(carbonAssets);
    }

    /**
     * 更新碳中和资产
     * @param carbonAssets 更新的碳中和资产对象
     * @return 更新是否成功
     */
    @Override
    public boolean updateCarbonAssets(CarbonAssets carbonAssets) {
        // 根据ID获取原有资产信息
        CarbonAssets assets = getById(carbonAssets.getId());
        // 如果资产不存在，则抛出异常
        if (assets == null){
            throw new CommonBizException("中和资产不存在");
        }
        // 更新资产信息
        return updateById(carbonAssets);
    }

    /**
     * 资产认证
     * @param assetsId 资产ID
     */
    @Override
    public void certified(String assetsId) {
        // 调用区块链消息生产者进行资产认证
        carbonBlockChainMsgProduce.assetsCertified(assetsId);
    }

}

